cat("\f")
rm(list=ls())
options(scipen = 999)

library(dplyr)  #adattáblákkal való műveletekhez
library(factoextra) #k- közép klaszterezéshez
library(ggplot2) #vizualizációkhoz

#a k-közép klaszterezés taratalmaz random elemeket, ezért egy seedet alkalmazok

set.seed(123)

#betöltöm a pixelek táblázatát:

df <- readRDS("data/full_df.RDS")

#betöltöm a k = 11 klasztereket

km <- readRDS("data/km/km11.RDS")

#a klasztereket hozzáilllesztem a táblázathoz:

df$km <- km$cluster

#Itt megnézem a clusterek átlagos színeit, ezt egy új táblába teszem

color_summary <- df %>% group_by(km) %>% summarise(R = mean(R),
                                                   G = mean(G),
                                                   B = mean(B))

#hexcode verzióba helyezem az RGB értékeket

color_summary <- color_summary %>% mutate(cluster_hex_code = rgb(red = R,
                                                         green = G,
                                                         blue = B,
                                                         maxColorValue = 255))
#késztek egy főkompónenst

pc <- prcomp(select(color_summary, c(R, G, B)))

pc <- pc$x %>% data.frame()

#a két legnagyobb főkompónenst hozzáillesztem a color summary táblához:

color_summary$pc1 <- pc$PC1
color_summary$pc2 <- pc$PC2

saveRDS(color_summary, "data/color_summary.RDS")

#a hexcode-t hozzárendelem az eredeti táblához

df <- df %>% mutate(hex_code = rgb(red = R,
                                   green = G,
                                   blue = B,
                                   maxColorValue = 255))

#majd új főkompónens értékeket is:

pc <- prcomp(select(df, c(R, G, B)))

summary(pc)

pc <- pc$x %>% data.frame()

df$pc1 <- pc$PC1
df$pc2 <- pc$PC2

#összeillesztem a két táblát

df <- left_join(df, select(color_summary, c(km, cluster_hex_code)), by = join_by(km))

#View(head(df))

########################################
#előre készített tábla szín besorolása:#
########################################

df$id <- 1:nrow(df)

ctable <- readxl::read_excel("data/color_table.xlsx")

ctable$id <- paste0(ctable$color_types, "_", ctable$shade)

nrow(ctable) - length(unique(ctable$id))

#hexcode a tábla színekhez is:

ctable <- ctable %>% mutate(secondary_hexcode = rgb(red = R,
                                   green = G,
                                   blue = B,
                                   maxColorValue = 255))

nrow(ctable) - length(unique(ctable$secondary_hexcode))

ctable2 <- ctable %>% group_by(color) %>% summarise(R = mean(R),
                                             G = mean(G),
                                             B = mean(B))

ctable2 <- ctable2 %>% mutate(primary_hexcode = rgb(red = R,
                                   green = G,
                                   blue = B,
                                   maxColorValue = 255))

ctable <- left_join(ctable, select(ctable2, c(color, primary_hexcode)), by = join_by(color))

length(unique(ctable$primary_hexcode))

saveRDS(ctable, "data/ctable.RDS")

rm(ctable2, km, pc)

#kiszámtom a tábla mindegyik színétől a távolságokat:

for (i in 1:nrow(ctable)) {
  
  eval(parse(text = paste0(
    "df <- df %>% mutate(", ctable$id[i], "= (R - unlist(ctable[i,'R']))**2
                      + (G - unlist(ctable[i, 'G']))**2
                      + (B - unlist(ctable[i,'B']))**2)"
    
  )))
  print(i)
}

names(df)

rm(i)

#létrehozok egy mátrixot, ami a df tábla színeinek távolságát tartalmazza a 
#a ctable színeitől:


#elmentem a tábla egy új verzióját:

df2 <- df[,which(names(df) %in% ctable$id == F)]

saveRDS(df2, "data/full_df2.RDS")

rm(df2)

#készítek egy táblát, ami csak távolság adatokat tartalmaz

df <- df[,which(names(df) %in% ctable$id)]

nrow(df)

ncol(df)

round(nrow(df) / 10000)

#minden 100000 sorra megekeresm a legközelebbit:

vec2 <- seq(from = 100000, to = nrow(df), by = 100000)
vec1 <- c(c(1), (vec2 + 1))
vec2[length(vec2) + 1] <- nrow(df)

vec1[5]
vec2[5]

complete_vector <- c()

for (i in 1:length(vec1)) {
  
  c_vector <- apply(df[vec1[i]:vec2[i],], 1, function(row) {
    colnames(df)[which.min(row)]
  })
  
  complete_vector <- c(complete_vector, c_vector)
  
  print(paste0(i,"/",length(vec1)))
  
}

length(complete_vector) == nrow(df)

rm(df)

#betöltöm a táblát és aztán hozzáillesztem a legközelebbi színeket:

df <- readRDS("data/full_df2.RDS")

df$ctable_nearest <- complete_vector

names(df)


df <- df[,which(names(df) %in% ctable$id == F)]

summary <- summarise(group_by(df, ctable_nearest), n = n())

#elmentem a táblázatot, aminek megvan az új változója egy új névvel:

saveRDS(df, "data/full_df3.RDS")
